#include <stdio.h>
#include <math.h>

// 24节气名称（顺序固定）
static const char *solarTerms[24] = {
    "小寒", "大寒", "立春", "雨水", "惊蛰", "春分",
    "清明", "谷雨", "立夏", "小满", "芒种", "夏至",
    "小暑", "大暑", "立秋", "处暑", "白露", "秋分",
    "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"
};

// 计算某年节气的日期（公历日）
// 利用近似公式，返回节气对应的“日”
// 参数：year:公历年，n：节气序号0~23
// 注意：此方法有误差，适合大致查询
int getSolarTermDay(int year, int n) {
    // 节气基准系数，单位天
    static const double C[] = {
        6.11, 20.84, 4.6295, 19.4599, 6.3826, 21.4155,
        5.59, 20.888, 6.318, 21.86, 6.5, 22.20,
        7.928, 23.65, 8.35, 23.95, 8.44, 23.822,
        9.098, 24.218, 8.218, 23.08, 7.9, 21.94
    };

    // 年份偏移（2000年为基准）
    int Y = year - 2000;

    // 计算公式(适合公历2000年以后)
    double D = 0;
    if (year >= 2000 && year <= 2099) {
        D = Y * 0.2422 + C[n] - (int)((Y - 1) / 4);
    } else {
        // 其他年份可自行调整或使用更复杂算法
        D = 0; // 暂时返回0表示不支持
    }

    return (int)D;
}

void solar_terms_7() {
    int year;
    printf("请输入查询的年份(2000~2099): ");
    if (scanf("%d", &year) != 1) {
        printf("输入格式错误\n");
        return;
    }
    if (year < 2000 || year > 2099) {
        printf("年份超出支持范围（2000~2099）\n");
        return;
    }

    printf("公历 %d 年的二十四节气如下：\n", year);
    for (int i = 0; i < 24; i++) {
        int day = getSolarTermDay(year, i);
        int month = 1 + (i / 2);  // 节气基本对应月份
        printf("%s : %d 月 %d 日\n", solarTerms[i], month, day);
    }
}
